package com.Offer;

/*
    面试题46：把数字翻译成字符串
    给定一个数字，按照下面的规则进行翻译：
    0翻译成'a'，1翻译成'b',....,一个数字可能有多个翻译
    比如12258有五个翻译，'bccfi','bwfi','bczi','mcfi','mzi'
    设计一个函数，计算一个数字有多少种不同的翻译
 */
public class demo46 {
    public static void main(String[] args) {

    }

    //从个位开始向前进行翻译，如果可以合并则增加i+2的次数，否则+1
    //例如12258中，2258分为2 2 5 8,22 5 8，2 25 8三种，258分为25 8,2 5 8两种
    //这个时候我们加入1判断是否1 2能否合并，可以则需要添加合并12之后的种类，则是12 258的种类，258是两种，2258是3种，所以12258是8种
    public static int GetTranslationCount(int number){
        String str = String.valueOf(number);
        int count = 0;
        int[] counts = new int[str.length()];
        for (int i = str.length() - 1; i >= 0; i++) {
            count = 0;
            //i是十位开始
            if(i < str.length() - 1){
                count = counts[i+1];
            }else{
                count = 1;
            }

            if(i < str.length() - 1){
                int digit1 = str.charAt(i)-'0';
                int digit2 = str.charAt(i+1)-'0';
                int covert = digit1*10+digit2;  //合并，判断是否大于25，如果大于则不能合并
                if(covert >= 10 && covert <=25){
                    if(i < str.length() - 2){
                        count += counts[i+2];   //如果能够合并并且i为百位以上的位数，则需要加入合并后的后一个的次数
                    }else{
                        count +=1;  //否则直接+1
                    }
                }
            }

            counts[i] = count;
        }
        return counts[0];
    }
}
